import sqlite3
import os

def check_string_in_database(url='', ua='', search_all=''):
    """
    检查输入字符串是否包含数据库中存储的任何正则表达式模式
    优化版本：使用迭代方式处理数据，避免一次性加载全部数据导致内存爆炸
    
    参数:
        url (str): 需要检查的URL字符串
        ua (str): 需要检查的UA字符串
        search_all (bool): 是否同时搜索url和ua字段，默认为False
    
    返回:
        bool: 如果输入字符串包含任何数据库中的模式，则返回True；否则返回False
    """
    db_path = 'regular_expression.db'
    
    # 检查数据库文件是否存在
    if not os.path.exists(db_path):
        print(f"错误: 数据库文件 {db_path} 不存在")
        return False
    
    # 设置每次获取的行数，避免一次性加载过多数据
    batch_size = 1000
    try:
        # 连接到SQLite数据库
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        if url != '' or search_all != '':
            # 检查url字段
            cursor.execute("SELECT url FROM string WHERE url IS NOT NULL")
        
            # 迭代处理结果，每次获取一部分数据
            while True:
                # 获取一批数据
                url_batch = cursor.fetchmany(batch_size)
                if not url_batch:
                    break  # 没有更多数据了
            
                # 检查当前批次中是否有匹配
                for (pattern,) in url_batch:
                    if pattern in url or pattern in search_all:
                        conn.close()
                        return True
        if ua != '' or search_all != '':
            # 检查ua字段
            cursor.execute("SELECT ua FROM string WHERE ua IS NOT NULL")
        
            # 迭代处理结果
            while True:
                # 获取一批数据
                ua_batch = cursor.fetchmany(batch_size)
                if not ua_batch:
                    break  # 没有更多数据了
            
                # 检查当前批次中是否有匹配
                for (pattern,) in ua_batch:
                    if pattern in ua or pattern in search_all:
                        conn.close()
                        return True
        
        # 关闭数据库连接
        conn.close()
        
        # 如果没有匹配到任何模式，返回False
        return False
        
    except sqlite3.Error as e:
        print(f"数据库操作错误: {e}")
        return False
    except Exception as e:
        print(f"发生错误: {e}")
        return False
    finally:
        # 确保无论如何都会关闭数据库连接
        if 'conn' in locals() and conn:
            try:
                conn.close()
            except:
                pass

# 示例用法
def test_function():
    test_string = "asystembbbcccddd"
    result = check_string_in_database(url = test_string)
    print(f"测试结果: {result}")

# 临时函数：创建SQLite数据库及示例数据
def create_test_database():
    """
    创建测试用的SQLite数据库，包含string表及示例数据
    用于测试check_string_in_database函数
    """
    db_path = 'regular_expression.db'
    
    try:
        # 连接数据库（如果不存在则创建）
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # 创建string表
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS string (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                url TEXT,
                ua TEXT
            )
        ''')
        
        # 清空表中现有数据（如果需要）
        cursor.execute('DELETE FROM string')
        
        # 插入示例数据
        sample_data = [
            ('system', None),
            ('test', 'Mozilla'),
            ('admin', 'Chrome'),
            ('login', 'Safari'),
            ('api', 'Edge'),
            ('dashboard', 'Firefox'),
            ('user', 'Opera'),
            ('profile', 'IE'),
            ('settings', 'Android'),
            ('logout', 'iOS')
        ]
        
        cursor.executemany('INSERT INTO string (url, ua) VALUES (?, ?)', sample_data)
        
        # 提交事务
        conn.commit()
        
        # 验证数据插入
        cursor.execute('SELECT COUNT(*) FROM string')
        count = cursor.fetchone()[0]
        print(f"数据库创建成功，插入了 {count} 条示例数据")
        
        # 显示部分数据用于验证
        print("\n部分示例数据:")
        cursor.execute('SELECT url, ua FROM string LIMIT 5')
        for row in cursor.fetchall():
            print(f"URL: {row[0]}, UA: {row[1]}")
        
    except sqlite3.Error as e:
        print(f"数据库创建错误: {e}")
    finally:
        if 'conn' in locals() and conn:
            try:
                conn.close()
            except:
                pass

if __name__ == "__main__":
    # 创建测试数据库
    create_test_database()
    # 运行测试函数
    test_function()